
#ifndef CONTROLEDGE_HPP_
#define CONTROLEDGE_HPP_

#include <string>
#include "../main/edge.hpp"

#define EDGE_STATUS_LEN 10

using namespace std;

/**
 * Class ControlEdge: su instancia es una arista previa
 * a la que se insertara en el grafo, para propositos de
 * control de cantidad de campos y formato de los
 * mismos.
 */
class ControlEdge {
private:
	std::string	edgeId;
	std::string roadName;
    RoadType	roadType;			//calle, avenida, autopista
    int			initialHeight;      //altura inicial
    int			finalHeight;        //altura final
	std::string nodeOriginId;
	std::string	nodeDestinyId;
	float 		longitude;
	float 		vel;
	int			status[EDGE_STATUS_LEN];

public:

	/**
	 * Constructor por defecto de la clase ControlEdge.
	 */
	ControlEdge();

	/**
	 * Destructor de la clase ControlEdge.
	 */
	virtual ~ControlEdge();

	/**
	 * Metodo getter del id de la arista de control.
	 * @return Retorna el id de la arista de control.
	 */
	std::string getEdgeId();

	/**
	 * Metodo setter del id de la arista de control.
	 * @param id de clase std::string
	 */
	void setEdgeId(std::string id);

	/**
	 * Metodo getter del tipo de camino (avenida, calle, autopista).
	 * @return Retorna el tipo de camino.
	 */
    RoadType getRoadType();

    /**
	 * Metodo setter del tipo de camino.
	 */
    void setRoadType(RoadType roadType);   

	/**
	 * Metodo getter del nombre del camino.
	 * @return Retorna el nombre del camino.
	 */
    std::string getRoadName();

    /**
	 * Metodo setter del nombre del camino.
	 */
    void setRoadName(std::string roadName);

	/**
	 * Metodo getter de la altura inicial de la arista.
	 * @return Retorna la altura inicial de la arista.
	 */
    int getInitialHeight();

    /**
	 * Metodo setter de la altura inicial de la arista.
	 */
    void setInitialHeight(int initialHeight);

    /**
	 * Metodo getter de la altura final de la arista.
	 * @return Retorna la altura final de la arista.
	 */
    int getFinalHeight();

    /**
	 * Metodo setter de la altura final de la arista.
	 */
    void setFinalHeight(int finalHeight);        

	/**
	 * Metodo getter del id del nodo origen de la
	 * arista de control.
	 * @return Retorna el id del nodo origen.
	 */
	std::string getNodeOriginId();

	/**
	 * Metodo setter del id del nodo origen de la
	 * arista de control.
	 * @param id del nodo origen de clase std::string.
	 */
	void setNodeOriginId(std::string origin);

	/**
	 * Metodo getter del id del nodo destino de la
	 * arista de control.
	 * @return Retorna el id del nodo destino.
	 */
	std::string getNodeDestinyId();

	/**
	 * Metodo setter del id del nodo destino de la
	 * arista de control.
	 * @param dest de clase std::string.
	 */
	void setNodeDestinyId(std::string dest);

	/**
	 * Metodo getter de la longitud de la arista de
	 * control.
	 * @return Retorna la longitud.
	 */
	float getLongitude();

	/**
	 * Metodo setter de la longitud de la arista de
	 * control.
	 * @param longitud de tipo float.
	 */
	void setLongitude(float longitude);

	/**
	 * Metodo getter de la velocidad de la arista de
	 * control.
	 * @return Retorna la velocidad.
	 */
	float getVelocity();

	/**
	 * Metodo setter de la velocidad de la arista de
	 * control.
	 * @param vel de tipo float.
	 */
	void setVelocity(float vel);

	/**
	 * Metodo getter del estatus del id de la arista de
	 * control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getEdgeIdStatus();

	/**
	 * Metodo getter del estatus del id del nodo origen
	 * de la arista de control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getNodeOriginIdStatus();

	/**
	 * Metodo getter del estatus del id del nodo destino
	 * de la arista de control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getNodeDestinyIdStatus();

	/**
	 * Metodo getter del estatus de la longitud de
	 * la arista de control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getLongitudeStatus();

	/**
	 * Metodo getter del estatus de la velocidad de
	 * la arista de control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getVelocityStatus();

	/**
	 * Metodo getter del estatus del tipo de camino
	 * la arista de control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getRoadTypeStatus();

	/**
	 * Metodo getter del estatus del nombre del camino de
	 * la arista de control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getRoadNameStatus();

	/**
	 * Metodo getter del estatus de la altura inicial de
	 * la arista de control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getInitialHeightStatus();

	/**
	 * Metodo getter del estatus de la altura final de
	 * la arista de control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getFinalHeightStatus();

	/**
	 * Metodo getter del estatus de la cantidad de
	 * campos de la arista de control.
	 * @return 1 si el estatus es valido.
	 * @return 0 si el estatus no es valido.
	 */
	int getNumberOfFieldsStatus();

	/**
	 * Metodo setter para marcar como estatus no valido
	 * el numero de campo pasado por parametro.
	 * @param fieldNumber de tipo int.
	 */
	void setFailStatus(int fieldNumber);

	/**
	 * Metodo setter para marcar como estatus valido
	 * el numero de campo pasado por parametro.
	 * @param fieldNumber de tipo int.
	 */
	void setSuccessStatus(int fieldNumber);

	/**
	 * Refresca los datos de la arista de control para
	 * dejarla como recién creada.
	 */
	void clear();
};

#endif /* CONTROLEDGE_HPP_ */
